﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1306.Classes
{
    internal static class TaskMatrix
    {
        private static Random _randomNumber = new Random();

        // Создание двумерного массива (матрицы), заполненного случайнымицелыми числами
        // по заданным размерам (указать кол-во строк и столбцов).
        // Дополнительно можно указать диапазон случайных значений
        public static int[,] CreateMatrix(int row, int column, int endRandom = 100, int startRandom = 0 )
        {
            int[,] matrix = new int[row, column];
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < column; j++)
                {
                    matrix[i, j] = _randomNumber.Next(startRandom, endRandom);
                }
            }
            return matrix;
        }
        
        // Создание двумерного массива (матрицы), заполненного случайными вещественными числами
        // по заданным размерам (указать кол-во строк и столбцов).
        // Дополнительно можно указать конец диапазона случайных значений (начало диапазона - 0.0)
        public static double[,] CreateMatrixDouble(int row, int column, int endRandom = 1, int round = 4)
        {
            double[,] matrix = new double[row, column];
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < column; j++)
                {
                    matrix[i, j] = Math.Round(_randomNumber.NextDouble() * endRandom, round);
                }
            }
            return matrix;
        }


        // Вывод матрицы на экран (значения - целые числа)
        public static void ReadMatrix(int[,] array)
        {
            int countRow = array.GetLength(0);      // Количество строк в матрице
            int countColumn = array.GetLength(1);   // Количество столбцов в матрице

            for (int i = 0; i < countRow; i++)
            {
                for (int j = 0; j < countColumn; j++)
                {
                    if (array[i, j] < 0)        // отрицательные элементы выделим красным цветом
                        Console.BackgroundColor = ConsoleColor.Red;
                    else
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                    }
                    Console.Write(array[i, j] + "\t");
                    Console.BackgroundColor = ConsoleColor.Black;
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }
        
        // Вывод матрицы на экран (значения - целые числа)
        public static void ReadMatrixDouble(double[,] array)
        {
            int countRow = array.GetLength(0);      // Количество строк в матрице
            int countColumn = array.GetLength(1);   // Количество столбцов в матрице

            for (int i = 0; i < countRow; i++)
            {
                for (int j = 0; j < countColumn; j++)
                {
                    Console.Write(array[i, j] + "\t");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }


        // Задача 1
        // Отсортировать по возрастанию элементов последней строки целочисленный
        // двухмерный массив 3×4
        public static void Matrix_1()
        {
            string task = "Отсортировать по возрастанию элементов последней строки целочисленный " +
                "двухмерный массив 3×4";
            Console.WriteLine("Задача 1");
            Console.WriteLine(task);
            Console.WriteLine("Исходный массив");
            int[,] ints = CreateMatrix(3, 4);
            ReadMatrix(ints);

            int[] ints_1 = new int[4];
            for (int i = 0; i < ints_1.Length; i++)
            {
                ints_1[i] = ints[2, i];
            }
            Array.Sort(ints_1);

            for (int i = 0; i < ints_1.Length; i++)
            {
                ints[2, i] = ints_1[i];
            }
            Console.WriteLine("Преобразованный массив");
            ReadMatrix(ints);
        }

        // Задача 2
        // Дан двухмерный массив 7×7. Найти сумму модулей отрицательных
        // нечетных элементов
        public static void Matrix_2()
        {
            string task = "Дан двухмерный массив 7×7. Найти сумму модулей отрицательных " +
                "нечетных элементов";
            Console.WriteLine("Задача 2");
            Console.WriteLine(task);
            Console.WriteLine("Исходный массив");

            int[,] array = CreateMatrix(7, 7, startRandom: -100, endRandom: 100);
            ReadMatrix(array);

            int summ = 0;
            int countRow = array.GetLength(0);      // Количество строк в матрице
            int countColumn = array.GetLength(1);   // Количество столбцов в матрице
            for (int i = 0; i < countRow; i++)
            {
                for (int j = 0; j < countColumn; j++)
                {
                    if (array[i, j] < 0 && array[i, j] % 2 == 0)
                    {
                        summ += Math.Abs(array[i, j]);
                    }
                }
            }
            Console.WriteLine($"Сумма модулей отрицательных нечетных элементов равна {summ}");
        }
        
        // Задача 3
        // Дан двухмерный массив 5×6. Определить среднее арифметическое
        // положительных элементов каждого столбца.
        public static void Matrix_3()
        {
            string task = "Дан двухмерный массив 5×6. Определить среднее арифметическое " +
                        "положительных элементов каждого столбца.";
            Console.WriteLine("Задача 3");
            Console.WriteLine(task);
            Console.WriteLine("Исходный массив");

            int[,] array = CreateMatrix(5, 6, startRandom: -100, endRandom: 100);
            ReadMatrix(array);

            int summ = 0;
            double count = 0;
            double average = 0;
            int countRow = array.GetLength(0);      // Количество строк в матрице
            int countColumn = array.GetLength(1);   // Количество столбцов в матрице
            for (int i = 0; i < countColumn; i++)
            {
                for (int j = 0; j < countRow; j++)
                {
                    if (array[j, i] > 0)
                    {
                        summ += array[j, i];
                        count++;
                    }
                }
                if (count > 0)
                    average = summ / count;
                Console.WriteLine($"Среднее арифметическое положительных элементов {i + 1} столбца равно {average}");
                summ = 0;
                count = 0;
                average = 0;
            }
        }
        
        // Задача 4
        // Дана вещественная квадратная матрица порядка 5. Найти наименьший
        // элемент на побочной диагонали.
        public static void Matrix_4()
        {
            string task = "Дана вещественная квадратная матрица порядка 5. Найти наименьший " +
                        "элемент на побочной диагонали.";
            Console.WriteLine("Задача 4");
            Console.WriteLine(task);
            Console.WriteLine("Исходный массив");

            double[,] array = CreateMatrixDouble(5, 5, 10);
            ReadMatrixDouble(array);

            int row = 4;
            int column = 0;
            double[] items = new double[5];
            for (int i = 0; i < items.Length; i++)
            {
                items[i] = array[row, column];
                row--;
                column++;
            }
            Array.Sort(items);
            Console.WriteLine($"Максимальный элемеент обочной диагонили - число {items[0]}");
        }
    }
}
